/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.flowumi.facade.Impl;

import com.flowumi.compiler.FlowUmiCompilerLexer;
import com.flowumi.compiler.FlowUmiCompilerParser;
import com.flowumi.compiler.FlowUmiSystemTree;
import com.flowumi.entity.Actividades;
import com.flowumi.entity.Algoritmo;
import com.flowumi.entity.Cursos;
import com.flowumi.entity.Cursosestudiantes;
import com.flowumi.entity.CursosestudiantesPK;
import com.flowumi.entity.Cursosestudiantesactividades;
import com.flowumi.entity.CursosestudiantesactividadesPK;
import com.flowumi.entityFacade.ActividadesFacadeLocal;
import com.flowumi.entityFacade.AlgoritmoFacadeLocal;
import com.flowumi.entityFacade.CursosFacadeLocal;
import com.flowumi.entityFacade.CursosestudiantesFacadeLocal;
import com.flowumi.entityFacade.CursosestudiantesactividadesFacadeLocal;
import com.flowumi.facade.EstudianteFacade;
import com.flowumi.util.Generador;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import org.antlr.runtime.ANTLRInputStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.CommonTreeNodeStream;
import org.antlr.runtime.RecognitionException;

/**
 *
 * @author ideacentre
 */
@Stateless
public class EstudianteFacadeImpl implements EstudianteFacade {

    private static final org.apache.log4j.Logger LOGGER =
            org.apache.log4j.Logger.getLogger(EstudianteFacadeImpl.class);

    @EJB
    CursosestudiantesFacadeLocal cursosestudiantesFacadeLocal;
    @EJB
    CursosestudiantesactividadesFacadeLocal cursosestudiantesactividadesFacadeLocal;
    @EJB
    CursosFacadeLocal cursosFacadeLocal;
    @EJB
    ActividadesFacadeLocal actividadesFacadeLocal;
    @EJB
    AlgoritmoFacadeLocal algoritmoFacadeLocal;

    @Override
    public List<Cursos> getListaCursosEstudiante(String nombreUsuario) {
        List<Cursosestudiantes> cursosestudianteses = cursosestudiantesFacadeLocal.getListaCursosEstudiante(nombreUsuario);
        List<Cursos> cursoses = new ArrayList<Cursos>();
        for (Cursosestudiantes cs : cursosestudianteses) {
            cursoses.add(cs.getCursos());
        }
        return cursoses;
    }

    @Override
    public Cursosestudiantes getCursoEstudiante(Long idCurso, String nombreUsuario) {
        CursosestudiantesPK cursosestudiantesPK = new CursosestudiantesPK(idCurso, nombreUsuario);
        return cursosestudiantesFacadeLocal.find(cursosestudiantesPK);
    }

    @Override
    public Cursosestudiantesactividades getCursoEstudianteActividad(Long idCurso, String nombreUsuario, Integer idActividad) {
        CursosestudiantesactividadesPK cursosestudiantesactividadesPK = new CursosestudiantesactividadesPK(idCurso, nombreUsuario, idActividad);
        Cursosestudiantesactividades cursosestudiantesactividades = cursosestudiantesactividadesFacadeLocal.find(cursosestudiantesactividadesPK);
        if (cursosestudiantesactividades != null) {
            return cursosestudiantesactividades;
        } else {
            cursosestudiantesactividades = new Cursosestudiantesactividades(cursosestudiantesactividadesPK);
            Actividades actividad = actividadesFacadeLocal.find(idActividad);
            cursosestudiantesactividades.setActividades(actividad);
            actividad.getCursosestudiantesactividadesList().add(cursosestudiantesactividades);
            cursosestudiantesactividadesFacadeLocal.create(cursosestudiantesactividades);
            actividadesFacadeLocal.edit(actividad);
            return cursosestudiantesactividades;
        }
    }

    @Override
    public void actualizarAlgoritmoActividad(Cursosestudiantesactividades cursosestudiantesactividades) {
        algoritmoFacadeLocal.create(cursosestudiantesactividades.getIdAlgoritmo());
        cursosestudiantesactividadesFacadeLocal.edit(cursosestudiantesactividades);
    }

    @Override
    public Algoritmo getAlgoritmoEstudainte(Integer idAlgoritmo) {
        return algoritmoFacadeLocal.find(idAlgoritmo);
    }

    @Override
    public void guardarAlgoritmo(Algoritmo algoritmo) {
        algoritmoFacadeLocal.edit(algoritmo);
    }

    @Override
    public void compilarAlgoritmo(Algoritmo algoritmo) {
        try {
            ByteArrayInputStream bis = new ByteArrayInputStream(algoritmo.getAlgoritmotexto());
            ANTLRInputStream input = new ANTLRInputStream(bis);
            FlowUmiCompilerLexer lexer = new FlowUmiCompilerLexer(input);
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            FlowUmiCompilerParser parser = new FlowUmiCompilerParser(tokens);
            FlowUmiCompilerParser.algoritmo_return r2 = parser.algoritmo();
            CommonTree t2 = (CommonTree) r2.getTree();
            CommonTreeNodeStream nodes2 = new CommonTreeNodeStream(t2);
            FlowUmiSystemTree walker = new FlowUmiSystemTree(nodes2);
            walker.algoritmo();
            algoritmo.setAlgoritmojava(walker.getCompilador().getArchivoJava().toString().getBytes());
            algoritmoFacadeLocal.edit(algoritmo);
        } catch (RecognitionException ex) {
            Logger.getLogger(EstudianteFacadeImpl.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(EstudianteFacadeImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public String correrAlgoritmo(Algoritmo algoritmo, String entradas, String nombre) {
        return Generador.correr(algoritmo.getAlgoritmojava(), entradas, nombre);
    }
}
